package modulo2.conversiones.temperatura;

import modulo2.conversiones.*;

/**
 * @todo completar javadoc
 * @author jjsanche
 */
public class ConvertidorTemperatura implements Convertidor {

    //Escalas
    private static final String CENTIGRADOS = "CENTIGRADOS";
    private static final String FAHRENHEIT = "FAHRENHEIT";
    private static final String KELVIN = "KELVIN";
    
    /**
     * @todo completar javadoc
     * @param escalaOrigen
     * @param valor
     * @param escalaDestino 
     */
    public void convertir(String escalaOrigen, String valor, String escalaDestino) {
        
        try {
            double valorDouble = Double.parseDouble(valor);            
            double valorConvertido = Double.NaN;
            
            if (escalaValida(escalaOrigen.toUpperCase())) {                
                switch (escalaOrigen.toUpperCase()) {
                    case CENTIGRADOS:
                        valorConvertido = centigradosA(escalaDestino.toUpperCase(), valorDouble);                        
                        break;
                    case FAHRENHEIT:
                        valorConvertido = fahrenheitA(escalaDestino.toUpperCase(), valorDouble);
                    case KELVIN:
                        valorConvertido = kelvinA(escalaDestino.toUpperCase(), valorDouble);
                }
                //@todo agregar L10N
                System.out.println(valorDouble + "� " + escalaOrigen.toUpperCase() + " = " + valorConvertido + "� " + escalaDestino.toUpperCase());
            } else {
                //@todo agregar L10N
                System.out.println("Escala invalida");
            }
        } catch (NumberFormatException nfe) {
            nfe.printStackTrace();
        }
    }
    
    /**
     * @todo completar javadoc
     * @param escalaDestino
     * @param valor
     * @return 
     */
    private double centigradosA(String escalaDestino, double valor) {
        double valorConvertido = Double.NaN;

        if (FAHRENHEIT.equals(escalaDestino)) {
            valorConvertido = valor * 1.8 + 32;
        } else if (KELVIN.equals(escalaDestino)) {
            valorConvertido = valor + 273.15;
        } else {
            //@todo agregar L10N
            System.out.println("Escala inv�lida");
        }

        return valorConvertido;
    }
    
    /**
     * @todo completar javadoc
     * @param escalaDestino
     * @param valor
     * @return 
     */
    private double fahrenheitA(String escalaDestino, double valor) {
        double valorConvertido = Double.NaN;
        
        if (CENTIGRADOS.equals(escalaDestino)) {
            valorConvertido = (valor - 32) / 1.8;
        } else if (KELVIN.equals(escalaDestino)) {
            valorConvertido = (5/9) * (valor - 32) + 273;
        } else {
            //@todo agregar L10N
            System.out.println("Escala invalida");
        }
        
        return valorConvertido;
    }
    
    /**
     * @todo completar javadoc
     * @param escalaDestino
     * @param valor
     * @return 
     */
    private double kelvinA(String escalaDestino, double valor) {
        double valorConvertido = Double.NaN;
        
        if (CENTIGRADOS.equals(escalaDestino)) {
            valorConvertido = valor - 273.15;
        } else if (FAHRENHEIT.equals(escalaDestino)) {
            valorConvertido = (5/9) * (valor - 273) + 32;
        } else {
            //@todo agregar L10N
            System.out.println("Escala invalida");
        }
        
        return valorConvertido;
    }
    
    /**
     * @todo completar javadoc
     * @param nombreEscala
     * @return 
     */
    public boolean escalaValida(String nombreEscala) {
        return CENTIGRADOS.equals(nombreEscala) ? true
                : FAHRENHEIT.equals(nombreEscala) ? true
                : KELVIN.equals(nombreEscala) ? true : false;
    }
}
